{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <center> Kaggle赛题 - 推特灾难型事件文本分类预测 </center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 赛题介绍"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "目前，推特已经成为了紧急情况下的重要沟通渠道，智能手机的普及使得人们能够实时更新和宣布他们所观察到的紧急情况，比如一些自然灾害等。正因为如此，许多机构有兴趣通过程序监控推特上的推文（如救灾组织和新闻机构），当灾害来临，可以快速采取行动。然而，对于一个人所说的话是否真的预示着一场灾难并不总是很清楚，本次赛题的主要任务便是建立一个机器学习模型来预测哪些推文（tweet）是在描述一场真的灾难，属于文本二分类任务。\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据简介：  \n",
    "相关数据集由kaggle官方提供，其特征包含以下几个部分：\n",
    "\n",
    "- id 每篇推文的独特编码\n",
    "- text 推文\n",
    "- location 发送推文的位置（可以为空）\n",
    "- keyword 每篇推文的关键词（可以为空）\n",
    "- target 预测变量，1表示为灾难推文，0表示非灾难推文"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "赛题评价标准为f1值，本人也在此采用f1进行模型评估"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 导入数据和相关的库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "np.random.seed(42)\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n",
    "sns.set(style='darkgrid',font_scale=1.2)\n",
    "\n",
    "from nltk.corpus import stopwords\n",
    "stop = set(stopwords.words('english'))\n",
    "from nltk.tokenize import word_tokenize\n",
    "from collections import defaultdict\n",
    "from collections import Counter\n",
    "from itertools import chain\n",
    "\n",
    "import re\n",
    "import string\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import cross_val_score, KFold\n",
    "from sklearn.metrics import precision_score,recall_score,f1_score\n",
    "\n",
    "import tensorflow as tf\n",
    "import tensorflow_hub as hub\n",
    "import tokenization\n",
    "\n",
    "from tensorflow.keras.preprocessing.text import Tokenizer\n",
    "from tensorflow.keras.models import Model\n",
    "from tensorflow.keras.callbacks import Callback\n",
    "from tensorflow.keras.layers import Input,Dense,Dropout\n",
    "from tensorflow.keras.optimizers import SGD"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train set size: (7613, 5)\n",
      "test set size: (3263, 4)\n"
     ]
    }
   ],
   "source": [
    "# 导入训练集与测试集\n",
    "\n",
    "train = pd.read_csv('tweet_train.csv')\n",
    "test = pd.read_csv('tweet_test.csv')\n",
    "\n",
    "print('train set size:',train.shape)\n",
    "print('test set size:',test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练集有7613个样本，测试集有3263个样本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>keyword</th>\n",
       "      <th>location</th>\n",
       "      <th>text</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Our Deeds are the Reason of this #earthquake M...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Forest fire near La Ronge Sask. Canada</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>All residents asked to 'shelter in place' are ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>13,000 people receive #wildfires evacuation or...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>7</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Just got sent this photo from Ruby #Alaska as ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>#RockyFire Update =&gt; California Hwy. 20 closed...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>10</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>#flood #disaster Heavy rain causes flash flood...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>13</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>I'm on top of the hill and I can see a fire in...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>14</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>There's an emergency evacuation happening now ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>15</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>I'm afraid that the tornado is coming to our a...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id keyword location                                               text  \\\n",
       "0   1     NaN      NaN  Our Deeds are the Reason of this #earthquake M...   \n",
       "1   4     NaN      NaN             Forest fire near La Ronge Sask. Canada   \n",
       "2   5     NaN      NaN  All residents asked to 'shelter in place' are ...   \n",
       "3   6     NaN      NaN  13,000 people receive #wildfires evacuation or...   \n",
       "4   7     NaN      NaN  Just got sent this photo from Ruby #Alaska as ...   \n",
       "5   8     NaN      NaN  #RockyFire Update => California Hwy. 20 closed...   \n",
       "6  10     NaN      NaN  #flood #disaster Heavy rain causes flash flood...   \n",
       "7  13     NaN      NaN  I'm on top of the hill and I can see a fire in...   \n",
       "8  14     NaN      NaN  There's an emergency evacuation happening now ...   \n",
       "9  15     NaN      NaN  I'm afraid that the tornado is coming to our a...   \n",
       "\n",
       "   target  \n",
       "0       1  \n",
       "1       1  \n",
       "2       1  \n",
       "3       1  \n",
       "4       1  \n",
       "5       1  \n",
       "6       1  \n",
       "7       1  \n",
       "8       1  \n",
       "9       1  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 数据分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1 推文样本个数统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "target类别个数：\n",
      "0    4342\n",
      "1    3271\n",
      "Name: target, dtype: int64\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# target的分布情况\n",
    "\n",
    "print('target类别个数：')\n",
    "print(train['target'].value_counts())\n",
    "\n",
    "plt.figure(figsize=(5,5))\n",
    "sns.countplot(train['target'])\n",
    "plt.title('class count')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在数据集中，0表示非灾害推文，1表示灾害推文。从结果看出，非灾害推文较多，有4342个，但总体来看，二者分类较为均匀。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 推文词汇总量统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "总词汇量：113461\n",
      "不重复词汇量：31924\n",
      "[('the', 2575), ('a', 1845), ('to', 1805), ('in', 1757), ('of', 1722), ('and', 1302), ('I', 1197), ('for', 820), ('is', 814), ('on', 773)]\n"
     ]
    }
   ],
   "source": [
    "# 统计词汇总量\n",
    "\n",
    "list_2d = train['text'].str.split().tolist()\n",
    "\n",
    "# 列表二维变一维\n",
    "list_1d = list(chain.from_iterable(list_2d))          \n",
    "print('总词汇量：{}'.format(len(list_1d)))\n",
    "\n",
    "word_dict = Counter(list_1d)\n",
    "print('不重复词汇量：{}'.format(len(word_dict)))\n",
    "top10 = word_dict.most_common(10)\n",
    "print(top10)                                           "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "word = []\n",
    "count = []\n",
    "for i in top10:\n",
    "    word.append(i[0])\n",
    "    count.append(i[1])\n",
    "\n",
    "df = pd.DataFrame({'词汇':word,'数量':count})    \n",
    "\n",
    "plt.figure(figsize=(5,5))\n",
    "sns.barplot(x=df['词汇'],y=df['数量'])\n",
    "plt.xlabel('top 10 words')\n",
    "plt.ylabel('count')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看出，出现频次最高的前10个单词都是停用词，也许对预测作用不大，后续会将其去除"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.3 不同推文的单词数量统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 不同推文单词数分布\n",
    "\n",
    "plt.figure(figsize=(7,5))\n",
    "\n",
    "disaster_tweet = train[train['target']==1]\n",
    "no_disaster_tweet = train[train['target']==0]\n",
    "\n",
    "sns.distplot(disaster_tweet['text'].str.split().apply(lambda x: len(x)),\n",
    "             color='green',label='disaster')\n",
    "\n",
    "sns.distplot(no_disaster_tweet['text'].str.split().apply(lambda x: len(x)),\n",
    "             color='red',label='not disaster')\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel('word count')\n",
    "plt.title('word count distribution')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可见不管是灾害推文还是非灾害推文，所用词的数量大多集中在5-25个之间，少部分能到达30个左右"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.4 不同推文字符数统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 不同推文字符数分布\n",
    "\n",
    "plt.figure(figsize=(7,5))\n",
    "\n",
    "disaster_tweet = train[train['target']==1]\n",
    "no_disaster_tweet = train[train['target']==0]\n",
    "\n",
    "sns.distplot(disaster_tweet['text'].apply(lambda x: len(x)),\n",
    "             color='green',label='disaster')\n",
    "\n",
    "sns.distplot(no_disaster_tweet['text'].apply(lambda x: len(x)),\n",
    "             color='red',label='not disaster')\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel('character count')\n",
    "plt.title('character count distribution')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过上述简单的分析，可知：\n",
    "\n",
    "1. 训练集中非灾害型推文分类较多，不过二者大致上还是比较均匀的。\n",
    "2. 赛题中每篇推文的字符个数平均有130个，还有一些推文字符较长。\n",
    "3. 每篇推文的用到的词汇个数大多在5-25之间，由于句子较短，后续序列补全时长度不用太长。\n",
    "4. 训练集使用了11w+的词汇量，数量占比前10的都是停用词，可以考虑去除。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 特征处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_new = train.copy()\n",
    "test_new = test.copy()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "随意展示10篇推文，可见推文中包含有url链接，非ASCII字符编码，标点符号，停用词等，都是需要清除的对象"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['So you have a new weapon that can cause un-imaginable destruction.',\n",
       " 'The f$&amp;@ing things I do for #GISHWHES Just got soaked in a deluge going for pads and tampons. Thx @mishacollins @/@',\n",
       " 'DT @georgegalloway: RT @Galloway4Mayor: \\x89ÛÏThe CoL police can catch a pickpocket in Liverpool Stree... http://t.co/vXIn1gOq4Q',\n",
       " 'Aftershock back to school kick off was great. I want to thank everyone for making it possible. What a great night.',\n",
       " 'in response to trauma Children of Addicts develop a defensive self - one that decreases vulnerability. (3',\n",
       " '@Calum5SOS you look like you got caught in a rainstorm this is amazing and disgusting at the same time',\n",
       " 'my favorite lady came to our volunteer meeting\\nhopefully joining her youth collision and i am excite http://t.co/Ij0wQ490cS',\n",
       " '@brianroemmele UX fail of EMV - people want to insert and remove quickly like a gas pump stripe reader. 1 person told me it crashed the POS',\n",
       " \"Can't find my ariana grande shirt  this is a fucking tragedy\",\n",
       " 'The Murderous Story Of America\\x89Ûªs First Hijacking http://t.co/EYUGk6byxr']"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_new['text'].sample(10).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def clean_text(text):\n",
    "    \"\"\"移除网页链接和非ASCII字符\"\"\"\n",
    "    \n",
    "    # 移除非ASCII字符\n",
    "    sentence = ''.join([x for x in text if x in string.printable])\n",
    "    \n",
    "    # 移除URL链接\n",
    "    sentence = re.sub(r\"http\\S+\", \"\", sentence)\n",
    "    \n",
    "    return sentence"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'please  click '"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 举个例子\n",
    "\n",
    "text1 = 'please \\x89 click http://t.co/wDUEaj8Q4J'\n",
    "clean_text(text1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 移除emoji表情\n",
    "\n",
    "def remove_emoji(text):\n",
    "    \"\"\"移除emoji表情\"\"\"\n",
    "    emoji = re.compile(\"[\"\n",
    "                      u\"\\U0001F600-\\U0001F64F\" \n",
    "                      u\"\\U0001F300-\\U0001F5FF\" \n",
    "                      u\"\\U0001F680-\\U0001F6FF\"\n",
    "                      u\"\\U00002702-\\U000027B0\"\n",
    "                      u\"\\U000024C2-\\U0001F251\"\n",
    "                      \"]+\",flags=re.UNICODE) \n",
    "    return emoji.sub(r'',text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'another Earthquake '"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 举个例子\n",
    "\n",
    "text2 = 'another Earthquake 😔😔'\n",
    "remove_emoji(text2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 移除标点符号\n",
    "\n",
    "def remove_punctuations(text):\n",
    "    \"\"\"移除标点符号\"\"\"\n",
    "    for p in string.punctuation:\n",
    "        text = text.replace(p,\"\")\n",
    "    \n",
    "    return text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'hello world'"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 举个例子\n",
    "\n",
    "text3 = '...@hello, world!!!'\n",
    "remove_punctuations(text3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 移除停用词\n",
    "\n",
    "def remove_stopwords(text):\n",
    "    \"\"\"移除停用词\"\"\"\n",
    "    words = [word for word in word_tokenize(text) if word not in stop]\n",
    "    sentence = ' '.join(words)\n",
    "    return sentence"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Dog'"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 举个例子\n",
    "\n",
    "text4 = 'it is a Dog'\n",
    "remove_stopwords(text4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "推文中还包含大量的缩写词，口语化用词，需要转换为标准单词，此处参考https://www.kaggle.com/rftexas/text-only-kfold-bert"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 缩写词纠正\n",
    "\n",
    "abbreviations = {\n",
    "    \"$\" : \" dollar \",\n",
    "    \"€\" : \" euro \",\n",
    "    \"4ao\" : \"for adults only\",\n",
    "    \"a.m\" : \"before midday\",\n",
    "    \"a3\" : \"anytime anywhere anyplace\",\n",
    "    \"aamof\" : \"as a matter of fact\",\n",
    "    \"acct\" : \"account\",\n",
    "    \"adih\" : \"another day in hell\",\n",
    "    \"afaic\" : \"as far as i am concerned\",\n",
    "    \"afaict\" : \"as far as i can tell\",\n",
    "    \"afaik\" : \"as far as i know\",\n",
    "    \"afair\" : \"as far as i remember\",\n",
    "    \"afk\" : \"away from keyboard\",\n",
    "    \"app\" : \"application\",\n",
    "    \"approx\" : \"approximately\",\n",
    "    \"apps\" : \"applications\",\n",
    "    \"asap\" : \"as soon as possible\",\n",
    "    \"asl\" : \"age, sex, location\",\n",
    "    \"atk\" : \"at the keyboard\",\n",
    "    \"ave.\" : \"avenue\",\n",
    "    \"aymm\" : \"are you my mother\",\n",
    "    \"ayor\" : \"at your own risk\", \n",
    "    \"b&b\" : \"bed and breakfast\",\n",
    "    \"b+b\" : \"bed and breakfast\",\n",
    "    \"b.c\" : \"before christ\",\n",
    "    \"b2b\" : \"business to business\",\n",
    "    \"b2c\" : \"business to customer\",\n",
    "    \"b4\" : \"before\",\n",
    "    \"b4n\" : \"bye for now\",\n",
    "    \"b@u\" : \"back at you\",\n",
    "    \"bae\" : \"before anyone else\",\n",
    "    \"bak\" : \"back at keyboard\",\n",
    "    \"bbbg\" : \"bye bye be good\",\n",
    "    \"bbc\" : \"british broadcasting corporation\",\n",
    "    \"bbias\" : \"be back in a second\",\n",
    "    \"bbl\" : \"be back later\",\n",
    "    \"bbs\" : \"be back soon\",\n",
    "    \"be4\" : \"before\",\n",
    "    \"bfn\" : \"bye for now\",\n",
    "    \"blvd\" : \"boulevard\",\n",
    "    \"bout\" : \"about\",\n",
    "    \"brb\" : \"be right back\",\n",
    "    \"bros\" : \"brothers\",\n",
    "    \"brt\" : \"be right there\",\n",
    "    \"bsaaw\" : \"big smile and a wink\",\n",
    "    \"btw\" : \"by the way\",\n",
    "    \"bwl\" : \"bursting with laughter\",\n",
    "    \"c/o\" : \"care of\",\n",
    "    \"cet\" : \"central european time\",\n",
    "    \"cf\" : \"compare\",\n",
    "    \"cia\" : \"central intelligence agency\",\n",
    "    \"csl\" : \"can not stop laughing\",\n",
    "    \"cu\" : \"see you\",\n",
    "    \"cul8r\" : \"see you later\",\n",
    "    \"cv\" : \"curriculum vitae\",\n",
    "    \"cwot\" : \"complete waste of time\",\n",
    "    \"cya\" : \"see you\",\n",
    "    \"cyt\" : \"see you tomorrow\",\n",
    "    \"dae\" : \"does anyone else\",\n",
    "    \"dbmib\" : \"do not bother me i am busy\",\n",
    "    \"diy\" : \"do it yourself\",\n",
    "    \"dm\" : \"direct message\",\n",
    "    \"dwh\" : \"during work hours\",\n",
    "    \"e123\" : \"easy as one two three\",\n",
    "    \"eet\" : \"eastern european time\",\n",
    "    \"eg\" : \"example\",\n",
    "    \"embm\" : \"early morning business meeting\",\n",
    "    \"encl\" : \"enclosed\",\n",
    "    \"encl.\" : \"enclosed\",\n",
    "    \"etc\" : \"and so on\",\n",
    "    \"faq\" : \"frequently asked questions\",\n",
    "    \"fawc\" : \"for anyone who cares\",\n",
    "    \"fb\" : \"facebook\",\n",
    "    \"fc\" : \"fingers crossed\",\n",
    "    \"fig\" : \"figure\",\n",
    "    \"fimh\" : \"forever in my heart\", \n",
    "    \"ft.\" : \"feet\",\n",
    "    \"ft\" : \"featuring\",\n",
    "    \"ftl\" : \"for the loss\",\n",
    "    \"ftw\" : \"for the win\",\n",
    "    \"fwiw\" : \"for what it is worth\",\n",
    "    \"fyi\" : \"for your information\",\n",
    "    \"g9\" : \"genius\",\n",
    "    \"gahoy\" : \"get a hold of yourself\",\n",
    "    \"gal\" : \"get a life\",\n",
    "    \"gcse\" : \"general certificate of secondary education\",\n",
    "    \"gfn\" : \"gone for now\",\n",
    "    \"gg\" : \"good game\",\n",
    "    \"gl\" : \"good luck\",\n",
    "    \"glhf\" : \"good luck have fun\",\n",
    "    \"gmt\" : \"greenwich mean time\",\n",
    "    \"gmta\" : \"great minds think alike\",\n",
    "    \"gn\" : \"good night\",\n",
    "    \"g.o.a.t\" : \"greatest of all time\",\n",
    "    \"goat\" : \"greatest of all time\",\n",
    "    \"goi\" : \"get over it\",\n",
    "    \"gps\" : \"global positioning system\",\n",
    "    \"gr8\" : \"great\",\n",
    "    \"gratz\" : \"congratulations\",\n",
    "    \"gyal\" : \"girl\",\n",
    "    \"h&c\" : \"hot and cold\",\n",
    "    \"hp\" : \"horsepower\",\n",
    "    \"hr\" : \"hour\",\n",
    "    \"hrh\" : \"his royal highness\",\n",
    "    \"ht\" : \"height\",\n",
    "    \"ibrb\" : \"i will be right back\",\n",
    "    \"ic\" : \"i see\",\n",
    "    \"icq\" : \"i seek you\",\n",
    "    \"icymi\" : \"in case you missed it\",\n",
    "    \"idc\" : \"i do not care\",\n",
    "    \"idgadf\" : \"i do not give a damn fuck\",\n",
    "    \"idgaf\" : \"i do not give a fuck\",\n",
    "    \"idk\" : \"i do not know\",\n",
    "    \"ie\" : \"that is\",\n",
    "    \"i.e\" : \"that is\",\n",
    "    \"ifyp\" : \"i feel your pain\",\n",
    "    \"IG\" : \"instagram\",\n",
    "    \"iirc\" : \"if i remember correctly\",\n",
    "    \"ilu\" : \"i love you\",\n",
    "    \"ily\" : \"i love you\",\n",
    "    \"imho\" : \"in my humble opinion\",\n",
    "    \"imo\" : \"in my opinion\",\n",
    "    \"imu\" : \"i miss you\",\n",
    "    \"iow\" : \"in other words\",\n",
    "    \"irl\" : \"in real life\",\n",
    "    \"j4f\" : \"just for fun\",\n",
    "    \"jic\" : \"just in case\",\n",
    "    \"jk\" : \"just kidding\",\n",
    "    \"jsyk\" : \"just so you know\",\n",
    "    \"l8r\" : \"later\",\n",
    "    \"lb\" : \"pound\",\n",
    "    \"lbs\" : \"pounds\",\n",
    "    \"ldr\" : \"long distance relationship\",\n",
    "    \"lmao\" : \"laugh my ass off\",\n",
    "    \"lmfao\" : \"laugh my fucking ass off\",\n",
    "    \"lol\" : \"laughing out loud\",\n",
    "    \"ltd\" : \"limited\",\n",
    "    \"ltns\" : \"long time no see\",\n",
    "    \"m8\" : \"mate\",\n",
    "    \"mf\" : \"motherfucker\",\n",
    "    \"mfs\" : \"motherfuckers\",\n",
    "    \"mfw\" : \"my face when\",\n",
    "    \"mofo\" : \"motherfucker\",\n",
    "    \"mph\" : \"miles per hour\",\n",
    "    \"mr\" : \"mister\",\n",
    "    \"mrw\" : \"my reaction when\",\n",
    "    \"ms\" : \"miss\",\n",
    "    \"mte\" : \"my thoughts exactly\",\n",
    "    \"nagi\" : \"not a good idea\",\n",
    "    \"nbc\" : \"national broadcasting company\",\n",
    "    \"nbd\" : \"not big deal\",\n",
    "    \"nfs\" : \"not for sale\",\n",
    "    \"ngl\" : \"not going to lie\",\n",
    "    \"nhs\" : \"national health service\",\n",
    "    \"nrn\" : \"no reply necessary\",\n",
    "    \"nsfl\" : \"not safe for life\",\n",
    "    \"nsfw\" : \"not safe for work\",\n",
    "    \"nth\" : \"nice to have\",\n",
    "    \"nvr\" : \"never\",\n",
    "    \"nyc\" : \"new york city\",\n",
    "    \"oc\" : \"original content\",\n",
    "    \"og\" : \"original\",\n",
    "    \"ohp\" : \"overhead projector\",\n",
    "    \"oic\" : \"oh i see\",\n",
    "    \"omdb\" : \"over my dead body\",\n",
    "    \"omg\" : \"oh my god\",\n",
    "    \"omw\" : \"on my way\",\n",
    "    \"p.a\" : \"per annum\",\n",
    "    \"p.m\" : \"after midday\",\n",
    "    \"pm\" : \"prime minister\",\n",
    "    \"poc\" : \"people of color\",\n",
    "    \"pov\" : \"point of view\",\n",
    "    \"pp\" : \"pages\",\n",
    "    \"ppl\" : \"people\",\n",
    "    \"prw\" : \"parents are watching\",\n",
    "    \"ps\" : \"postscript\",\n",
    "    \"pt\" : \"point\",\n",
    "    \"ptb\" : \"please text back\",\n",
    "    \"pto\" : \"please turn over\",\n",
    "    \"qpsa\" : \"what happens\",\n",
    "    \"ratchet\" : \"rude\",\n",
    "    \"rbtl\" : \"read between the lines\",\n",
    "    \"rlrt\" : \"real life retweet\", \n",
    "    \"rofl\" : \"rolling on the floor laughing\",\n",
    "    \"roflol\" : \"rolling on the floor laughing out loud\",\n",
    "    \"rotflmao\" : \"rolling on the floor laughing my ass off\",\n",
    "    \"rt\" : \"retweet\",\n",
    "    \"ruok\" : \"are you ok\",\n",
    "    \"sfw\" : \"safe for work\",\n",
    "    \"sk8\" : \"skate\",\n",
    "    \"smh\" : \"shake my head\",\n",
    "    \"sq\" : \"square\",\n",
    "    \"srsly\" : \"seriously\", \n",
    "    \"ssdd\" : \"same stuff different day\",\n",
    "    \"tbh\" : \"to be honest\",\n",
    "    \"tbs\" : \"tablespooful\",\n",
    "    \"tbsp\" : \"tablespooful\",\n",
    "    \"tfw\" : \"that feeling when\",\n",
    "    \"thks\" : \"thank you\",\n",
    "    \"tho\" : \"though\",\n",
    "    \"thx\" : \"thank you\",\n",
    "    \"tia\" : \"thanks in advance\",\n",
    "    \"til\" : \"today i learned\",\n",
    "    \"tl;dr\" : \"too long i did not read\",\n",
    "    \"tldr\" : \"too long i did not read\",\n",
    "    \"tmb\" : \"tweet me back\",\n",
    "    \"tntl\" : \"trying not to laugh\",\n",
    "    \"ttyl\" : \"talk to you later\",\n",
    "    \"u\" : \"you\",\n",
    "    \"u2\" : \"you too\",\n",
    "    \"u4e\" : \"yours for ever\",\n",
    "    \"utc\" : \"coordinated universal time\",\n",
    "    \"w/\" : \"with\",\n",
    "    \"w/o\" : \"without\",\n",
    "    \"w8\" : \"wait\",\n",
    "    \"wassup\" : \"what is up\",\n",
    "    \"wb\" : \"welcome back\",\n",
    "    \"wtf\" : \"what the fuck\",\n",
    "    \"wtg\" : \"way to go\",\n",
    "    \"wtpa\" : \"where the party at\",\n",
    "    \"wuf\" : \"where are you from\",\n",
    "    \"wuzup\" : \"what is up\",\n",
    "    \"wywh\" : \"wish you were here\",\n",
    "    \"yd\" : \"yard\",\n",
    "    \"ygtr\" : \"you got that right\",\n",
    "    \"ynk\" : \"you never know\",\n",
    "    \"zzz\" : \"sleeping bored and tired\"\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def convert_abbrev(word):\n",
    "    \"\"\"转换缩写词为标准单词\"\"\"\n",
    "    return abbreviations[word.lower()] if word.lower() in abbreviations.keys() else word\n",
    "\n",
    "def convert_abbrev_in_text(text):\n",
    "    \"\"\"把推文中缩写词转换为标准单词\"\"\"\n",
    "    tokens = word_tokenize(text)\n",
    "    tokens = [convert_abbrev(word) for word in tokens]\n",
    "    text = ' '.join(tokens)\n",
    "    return text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'It will spend 400  dollar '"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 举个例子\n",
    "\n",
    "text5 = 'It will spend 400$'\n",
    "convert_abbrev_in_text(text5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_new[\"text\"] = train_new[\"text\"].apply(lambda x: clean_text(x))\n",
    "test_new[\"text\"] = test_new[\"text\"].apply(lambda x: clean_text(x))\n",
    "    \n",
    "train_new[\"text\"] = train_new[\"text\"].apply(lambda x: remove_emoji(x))\n",
    "test_new[\"text\"] = test_new[\"text\"].apply(lambda x: remove_emoji(x))\n",
    "\n",
    "train_new[\"text\"] = train_new[\"text\"].apply(lambda x: remove_stopwords(x))\n",
    "test_new[\"text\"] = test_new[\"text\"].apply(lambda x: remove_stopwords(x))\n",
    "\n",
    "train_new[\"text\"] = train_new[\"text\"].apply(lambda x: convert_abbrev_in_text(x))\n",
    "test_new[\"text\"] = test_new[\"text\"].apply(lambda x: convert_abbrev_in_text(x))\n",
    "\n",
    "train_new[\"text\"] = train_new[\"text\"].apply(lambda x: remove_punctuations(x))\n",
    "test_new[\"text\"] = test_new[\"text\"].apply(lambda x: remove_punctuations(x))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. 词向量与建模"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5.1 TFIDF + 逻辑回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tfidf\n",
    "\n",
    "tfidf = TfidfVectorizer()\n",
    "train_text_vec = tfidf.fit_transform(train_new['text'])\n",
    "test_text_vec = tfidf.transform(test_new['text'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "kfolds = KFold(n_splits=10,shuffle=True,random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'C': 3, 'penalty': 'l2'} 0.7434945580999792\n"
     ]
    }
   ],
   "source": [
    "# 逻辑回归\n",
    "\n",
    "param_grid = {'C':[1,2,3,4,5],'penalty':['l1','l2']}\n",
    "\n",
    "lr = LogisticRegression(random_state=42)\n",
    "\n",
    "gs = GridSearchCV(lr,param_grid=param_grid,scoring='f1',cv=kfolds)\n",
    "gs = gs.fit(train_text_vec,train.target)\n",
    "\n",
    "print(gs.best_params_,gs.best_score_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "f1平均分：0.743493\n"
     ]
    }
   ],
   "source": [
    "lr = LogisticRegression(C=3,random_state=42)\n",
    "score = cross_val_score(lr,train_text_vec,train.target,scoring='f1',cv=kfolds)\n",
    "print('f1平均分：{:.6}'.format(score.mean()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "TFIDF和逻辑回归的组合比较简单，虽然TF-IDF通过单词频次和逆文档频率相乘的形式考虑到了单词的重要性，但基本没有考虑到上下文关系，这个评分也不是特别高"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5.2 BERT"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "先定义一个评估标准，由于keras中的metric不包含f1值的API，故在此需要自己定义"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "class evaluation(Callback):\n",
    "    def __init__(self,train_data=(),validation_data=()):\n",
    "        self.x_train,self.y_train = train_data        \n",
    "        self.x_valid,self.y_valid = validation_data\n",
    "        \n",
    "    def on_epoch_end(self,epoch,logs={}):\n",
    "        \"\"\"每一轮迭代后，计算presion,recall,f1值\"\"\"\n",
    "        train_predict = np.round(self.model.predict(self.x_train))\n",
    "        train_precision = precision_score(self.y_train,train_predict)\n",
    "        train_recall = recall_score(self.y_train,train_predict)\n",
    "        train_f1 = f1_score(self.y_train,train_predict)\n",
    "        \n",
    "        valid_predict = np.round(self.model.predict(self.x_valid))\n",
    "        valid_precision = precision_score(self.y_valid,valid_predict)\n",
    "        valid_recall = recall_score(self.y_valid,valid_predict)\n",
    "        valid_f1 = f1_score(self.y_valid,valid_predict)\n",
    "        \n",
    "        print('train_precision: {:.5} - train_recall: {:.5} - train_f1: {:.5}'.format(\n",
    "        train_precision,train_recall,train_f1))\n",
    "        print('valid_precision: {:.5} - valid_recall: {:.5} - valid_f1: {:.5}'.format(\n",
    "        valid_precision,valid_recall,valid_f1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def bert_encode(texts, tokenizer, max_len=32):\n",
    "    '''把文本处理成bert模型的输入'''\n",
    "    all_tokens = []\n",
    "    all_masks = []\n",
    "    all_segments = []\n",
    "    \n",
    "    for text in texts:\n",
    "        text = tokenizer.tokenize(text)\n",
    "            \n",
    "        text = text[:max_len-2]\n",
    "        input_sequence = [\"[CLS]\"] + text + [\"[SEP]\"]\n",
    "        pad_len = max_len - len(input_sequence)\n",
    "        \n",
    "        tokens = tokenizer.convert_tokens_to_ids(input_sequence)\n",
    "        tokens += [0] * pad_len\n",
    "        pad_masks = [1] * len(input_sequence) + [0] * pad_len\n",
    "        segment_ids = [0] * max_len\n",
    "        \n",
    "        all_tokens.append(tokens)\n",
    "        all_masks.append(pad_masks)\n",
    "        all_segments.append(segment_ids)\n",
    "    \n",
    "    return np.array(all_tokens), np.array(all_masks), np.array(all_segments)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "def build_model(bert_layer, dropout_num,learning_rate,momentum=0.9,max_len=32):\n",
    "    '''搭建bert模型'''\n",
    "    \n",
    "    # 输入\n",
    "    input_word_ids = Input(shape=(max_len,), dtype=tf.int32, name=\"input_word_ids\")\n",
    "    input_mask = Input(shape=(max_len,), dtype=tf.int32, name=\"input_mask\")\n",
    "    segment_ids = Input(shape=(max_len,), dtype=tf.int32, name=\"segment_ids\")\n",
    "    \n",
    "    # 输出\n",
    "    pooled_output, sequence_output = bert_layer([input_word_ids, input_mask, segment_ids])\n",
    "    cls_output = sequence_output[:, 0, :]\n",
    "    \n",
    "    # 接一层全连接层，输出单元为1，激活函数为sigmoid，表示二分类\n",
    "    if dropout_num == 0:\n",
    "        out = Dense(1, activation='sigmoid')(cls_output)\n",
    "    else:\n",
    "        x = Dropout(dropout_num,seed=42)(cls_output)\n",
    "        out = Dense(1, activation='sigmoid')(x)\n",
    "    \n",
    "    # 定义优化器\n",
    "    optimizer = SGD(learning_rate=learning_rate,momentum=momentum)\n",
    "    \n",
    "    bert_model = Model(inputs=[input_word_ids, input_mask, segment_ids], outputs=out)\n",
    "    bert_model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])\n",
    "    \n",
    "    return bert_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入预训练的BERT模型\n",
    "bert_url = \"https://hub.tensorflow.google.cn/tensorflow/bert_en_uncased_L-12_H-768_A-12/2\"\n",
    "bert_layer = hub.KerasLayer(bert_url, trainable=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "vocab_file = bert_layer.resolved_object.vocab_file.asset_path.numpy()\n",
    "do_lower_case = bert_layer.resolved_object.do_lower_case.numpy()\n",
    "tokenizer = tokenization.FullTokenizer(vocab_file, do_lower_case)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(6090, 5) (1523, 5) (6090,) (1523,)\n"
     ]
    }
   ],
   "source": [
    "# 划分训练集和验证集\n",
    "x_train,x_valid,y_train,y_valid = train_test_split(train_new,train_new['target'].values,\n",
    "                                                   test_size=0.2,shuffle=True,random_state=42)\n",
    "print(x_train.shape,x_valid.shape,y_train.shape,y_valid.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train_input = bert_encode(x_train.text.values, tokenizer)\n",
    "x_valid_input = bert_encode(x_valid.text.values, tokenizer)\n",
    "test_new_input = bert_encode(test_new.text.values, tokenizer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  101, 26103,  7481,  4106,  2342,  2224,  9593,  5968,  3386,\n",
       "       20168, 19841,  2887,  2510,  4188,  7806,   102,     0,     0,\n",
       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
       "           0,     0,     0,     0,     0])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train_input[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "eva = evaluation(train_data=(x_train_input,y_train),validation_data=(x_valid_input,y_valid))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 建立模型\n",
    "model_BERT = build_model(bert_layer,dropout_num=0.2,learning_rate=0.0001)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/3\n",
      "train_precision: 0.84893 - train_recall: 0.74371 - train_f1: 0.79284\n",
      "valid_precision: 0.83275 - valid_recall: 0.72881 - valid_f1: 0.77732\n",
      "762/762 - 82s - loss: 0.5136 - accuracy: 0.7501 - val_loss: 0.4183 - val_accuracy: 0.8221\n",
      "Epoch 2/3\n",
      "train_precision: 0.90606 - train_recall: 0.72464 - train_f1: 0.80526\n",
      "valid_precision: 0.88846 - valid_recall: 0.71186 - valid_f1: 0.79042\n",
      "762/762 - 82s - loss: 0.4237 - accuracy: 0.8159 - val_loss: 0.3971 - val_accuracy: 0.8391\n",
      "Epoch 3/3\n",
      "train_precision: 0.85024 - train_recall: 0.81846 - train_f1: 0.83405\n",
      "valid_precision: 0.80655 - valid_recall: 0.79661 - valid_f1: 0.80155\n",
      "762/762 - 82s - loss: 0.3880 - accuracy: 0.8343 - val_loss: 0.3975 - val_accuracy: 0.8319\n"
     ]
    }
   ],
   "source": [
    "# 开始训练\n",
    "bert = model_BERT.fit(\n",
    "    x_train_input, y_train,\n",
    "    validation_data = (x_valid_input,y_valid),\n",
    "    epochs = 3,\n",
    "    verbose = 2,\n",
    "    callbacks=[eva],\n",
    "    batch_size = 8,\n",
    "    shuffle=True\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最终在训练集上的f1值为0.834，在验证集上为0.8015，有一点过拟合，不过其表现要比tfidf+逻辑回归要好不少"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6. 预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "sample_sub = pd.read_csv('sample_submission.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pre = model_BERT.predict(test_new_input)\n",
    "y_pre = np.round(y_pre).astype(int).reshape(3263)\n",
    "sub = pd.DataFrame({'id':sample_sub['id'].values,'target':y_pre})\n",
    "sub.to_csv('submission.csv',index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>9</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>11</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id  target\n",
       "0   0       1\n",
       "1   2       1\n",
       "2   3       1\n",
       "3   9       1\n",
       "4  11       1"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sub.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "参考kernel:\n",
    "\n",
    "https://www.kaggle.com/vbmokin/nlp-eda-bag-of-words-tf-idf-glove-bert    \n",
    "https://www.kaggle.com/gunesevitan/nlp-with-disaster-tweets-eda-cleaning-and-bert  \n",
    "https://www.kaggle.com/shahules/basic-eda-cleaning-and-glove  \n",
    "https://www.kaggle.com/rftexas/text-only-kfold-bert"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
